package main.beans;

import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import main.exceptions.EspecieIndefinidaException;
import main.exceptions.NomeVazioException;
import main.interfaces.Cadastravel;

public class Animal implements Cadastravel, Serializable {

    public static final int MASCULINO = 0;
    public static final int FEMININO = 1;
    
    private String numeroCadastro;
    private Date dataCadastro;
    private String nome;
    private String idadeAproximada;
    private String especie;
    private int sexo;
    private String raca;
    private String cor;
    private String descricao;
    private List<Doenca> historicoDoencas;
    private String estadoSaude;
    private boolean aptoAdocao;

    public Animal(String nome, String especie, String raca, int sexo, String cor) throws Exception {
        if (nome.isEmpty())
            throw new NomeVazioException();
        if (especie.isEmpty())
            throw new EspecieIndefinidaException();

        this.nome = nome;
        this.especie = especie;
        this.raca = raca;
        this.sexo = sexo;
        this.cor = cor;
        
        dataCadastro = Calendar.getInstance().getTime();
        this.numeroCadastro = Math.abs(hashCode()) + "";
    }

    @Override
    public String getNumeroCadastro() {
        return numeroCadastro;
    }

    @Override
    public void setNumeroCadastro(String cadastro) {
        numeroCadastro = cadastro;
    }

    @Override
    public Date getDataCadastro() {
        return dataCadastro;
    }

    @Override
    public String getNome() {
        return nome;
    }

    @Override
    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getIdade() {
        return idadeAproximada;
    }

    public void setIdade(String idadeAproximada) {
        this.idadeAproximada = idadeAproximada;
    }

    public String getEspecie() {
        return especie;
    }

    public void setEspecie(String especie) {
        this.especie = especie;
    }

    public int getSexo() {
        return sexo;
    }

    public void setSexo(int sexo) {
        this.sexo = sexo;
    }

    public String getRaca() {
        return raca;
    }

    public void setRaca(String raca) {
        this.raca = raca;
    }

    public String getCor() {
        return cor;
    }

    public void setCor(String cor) {
        this.cor = cor;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public List<Doenca> getHistoricoDoencas() {
        return historicoDoencas;
    }

    public void setHistoricoDoencas(List<Doenca> historicoDoencas) {
        this.historicoDoencas = historicoDoencas;
    }

    public String getEstadoSaude() {
        return estadoSaude;
    }

    public void setEstadoSaude(String estadoSaude) {
        this.estadoSaude = estadoSaude;
    }

    public boolean isAptoAdocao() {
        return aptoAdocao;
    }

    public void setAptoAdocao(boolean aptoAdocao) {
        this.aptoAdocao = aptoAdocao;
    }

    public boolean adicionaDoenca(Doenca doenca) {
        return historicoDoencas.add(doenca);
    }

    @Override
    public String toString() {
	return "nome: " + getNome() + " especie: " + especie + " cadastro: " + numeroCadastro;
    }
	
    @Override
    public boolean equals(Object objeto) {
        if (!(objeto instanceof Animal))
            return false;
        Animal outro = (Animal) objeto;
        return outro.getNome().equals(getNome()) && outro.getEspecie().equals(getEspecie()) && outro.getRaca().equals(getRaca()) && outro.getSexo() == getSexo();
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 37 * hash + Objects.hashCode(this.nome);
        hash = 37 * hash + Objects.hashCode(this.especie);
        hash = 37 * hash + this.sexo;
        hash = 37 * hash + Objects.hashCode(this.raca);
        hash = 37 * hash + Objects.hashCode(this.cor);
        return hash;
    }
}
